package org.com.yz.dubbo.web.ctrl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringEscapeUtils;
import org.com.yz.common.annotion.Parameter;
import org.com.yz.common.constant.PayConstant;
import org.com.yz.common.util.ClassRefUtil;
import org.com.yz.common.util.MyLog;
import org.com.yz.common.util.ToolUtil;
import org.com.yz.dal.dao.model.BankCard;
import org.com.yz.dal.dao.model.MchAccnt;
import org.com.yz.dubbo.api.service.IMchAccntService;
import org.com.yz.dubbo.web.service.CheckWithDrawService;
import org.com.yz.dubbo.web.service.RpcCommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 创建子商户账户(h含绑卡)
 * @author
 * @date
 */
@RestController
public class CreateMchAccntSubCtrl {

    private final MyLog _log = MyLog.getLog(CreateMchAccntSubCtrl.class);

    @Reference(version = "1.0.0", timeout = 10000, retries = 0)
    public IMchAccntService iMchAccntService;

    @Autowired
    private RpcCommonService rpcCommonService;

    @Autowired
    private CheckWithDrawService checkWithDrawService;



    @PostMapping(value = "/api/createMchSubMch.htm")
    @Parameter
    public String createMchSubMchAccnt(String data,String sign) {
        /*String result = StringEscapeUtils.unescapeJava(data);
        MchAccnt accnt = null;
        Request001 rq001 = JSONObject.parseObject(result, Request001.class);
        Request001 res = new Request001();
        String mchNo = rq001.getMchNo();//商户号
        try {
            //外部子商户号已存在，返回失败，但是返回信息里加上子商户账号,银行卡信息
            accnt = new MchAccnt();
            accnt.setOutMchAccntNo(rq001.getBizContent().getOutMchAccntNo());
            accnt.setMchNo(mchNo);
            List<MchAccnt>  mchAccnt = iMchAccntService.selectMchAccnt(accnt);
            if(mchAccnt.size()>0){
                accnt = new MchAccnt();
                accnt.setMchAccntNo(mchAccnt.get(0).getMchAccntNo());
                accnt.setOutMchAccntNo(mchAccnt.get(0).getOutMchAccntNo());
                res.setBizContent(accnt);
                _log.info("创建子商户账户失败:"+PayConstant.RETURN_DEPOSIT_MCHNO_REPEATS);
               return ClassRefUtil.createRetData(rq001,res,PayConstant.RETURN_DEPOSIT_MCHNO_REPEAT,PayConstant.RETURN_DEPOSIT_MCHNO_REPEATS);
            }
            //检查是否存在该银行卡，如果存在，则返回账户信息+银行卡信息
//            BankCard bankCard = checkWithDrawService.checkNostro(req.getBizContent().getCardNo(),req.getBizContent().getMchAccntNo(),req.getMchNo(),"0");



            //确定接口入参： mch_accnt_name	子商户账户名称
            //out_mch_accnt_no	商户系统内部子商户账号
            //link_name	联系人姓名
            //link_phone	联系人电话
            //link_email	联系人 email
            //card_accnt_type	银行卡账户类型	String	是	银行卡账户类型：0-对公；1-对私
            //card_no	银行卡号	string	是	卡号
            //bank_no	银行代码	string	是	银行代码
            //bank_name	开户行名称	string	是	中国银行
            //bank_branch_name	分支行信息	String	是	杭州滨江支行
            //user_name	户名	string	是	张三/东和律师事务所
            //card_phone	银行预留手机号码	string	是	银行预留手机号码
            //card_type	银行卡类型	string	是	银行卡类型：0-储蓄卡;1-信用卡
            // 银行卡账户类型为  【对私客户】
            //cert_type	证件类型 0身份证( 目前仅支持身份证)	string	是	0
            //cert_no	持有人身份证号	string	是	持有人证件号
            //card_cvn	信用卡 cvn	string		信用卡背面末三位安全码(信用卡认证必填，即 card_type=1)
            //card_expire_dat e	银行卡有效期	string		信用卡有效期(信用卡认证必填)
            //银行卡账户类型为  【对公客户】
            //notify_url	异步通知地址	string	是	用于小额打款成功后通知http:www.xxxxx

            //绑卡鉴权（确定一个用户是否可以绑多个卡），如果可以绑多张卡，如何校验卡是否已经绑过

                //1.分对公对私，如果对私，四要素鉴权
//            rpcCommonService.bankCardService.bandCardHandle(card.getBizContent( ), card.getMchNo( ), card.getOutTransNo( ), card.getBizType( ));

            String remsg = "";
            JSONObject jsonObjecta = (JSONObject) JSONObject.parse(result);  //转换为json
            if (result.contains("errcode")) {  //代表失败

            }
            if (result.contains("appid") && result.contains("auth_status")) {  //代表成功
                if ("1".equals(jsonObjecta.get("auth_status"))) {   //认证成功
                        //开设子商户，插入卡信息，
                }
                if ("0".equals(jsonObjecta.get("auth_status"))) {   //待认证

                }
                if ("3".equals(jsonObjecta.get("auth_status"))) {   //认证处理中

                }
                if ("2".equals(jsonObjecta.get("auth_status"))) {   //认证失败
                    //
                }
            }
            //如果对公 小额打款，插入银行卡信息（无子账户号），异步通知，等待调用往账接口（传银行卡信息，如果金额对，则开户并绑卡）
                //问题，如果先插入卡信息，那么如果有两个商户绑定同样的卡，偏偏都在验证中，更新会出错（更新两条一样的，是否需要限制同一商户下，银行卡唯一），
                //如果不插入卡信息，小额打款将无法校验（需要存入小额打款金额）
            //是否可以对私不插入卡信息，等待验证成功后在插入卡信息，商户信息；对公则先插入卡信息，校验后再更新卡绑定状态，插入商户信息
//            bankCard = rpcCommonService.bankCardService.binkCompanyCard(card);


            //创建子商户账户
            Map<String,Object> resultMap = rpcCommonService.createMchSubService.createMchSub(data);
            String ss = resultMap.get("bizContent").toString();

            if(ss==null){//如果创建失
                res.setBizContent(null);
                _log.info("创建子商户账户失败");
                return ClassRefUtil.createRetData(rq001,res,PayConstant.RETURN_DEPOSIT_CODE_ERROR,PayConstant.RETURN_DEPOSIT_CODES_ERROR);
            }
            MchAccnt accnt1 = JSONObject.parseObject(ss,MchAccnt.class);
            res.setBizContent(accnt1);
            return ClassRefUtil.createRetData(rq001,res,PayConstant.RETURN_DEPOSIT_SUCESS,PayConstant.RETURN_VALUE_SUCCESS);
            } catch (Exception e) {
            _log.error(e, ToolUtil.getExceptionMsg(e));
            return ClassRefUtil.createRetData(rq001,res,PayConstant.RETURN_DEPOSIT_CODE_ERROR,PayConstant.RETURN_DEPOSIT_CODES_ERROR);
        }*/
        return null;
    }

}
